-
- #include <stdio.h>
-
- #define SHIFT(x) (x < 0 ? 0 : (1 << x))
- #define SHIFT7(BIT, ...) SHIFT(BIT)
- #define SHIFT6(BIT, ...) SHIFT(BIT) | SHIFT7(__VA_ARGS__, -1)
- #define SHIFT5(BIT, ...) SHIFT(BIT) | SHIFT6(__VA_ARGS__, -1)
- #define SHIFT4(BIT, ...) SHIFT(BIT) | SHIFT5(__VA_ARGS__, -1)
- #define SHIFT3(BIT, ...) SHIFT(BIT) | SHIFT4(__VA_ARGS__, -1)
- #define SHIFT2(BIT, ...) SHIFT(BIT) | SHIFT3(__VA_ARGS__, -1)
- #define SHIFT1(BIT, ...) SHIFT(BIT) | SHIFT2(__VA_ARGS__, -1)
- #define SHIFT0(BIT, ...) SHIFT(BIT) | SHIFT1(__VA_ARGS__, -1)
- #define MASK(...) (SHIFT0(__VA_ARGS__))
- #define SET_BITS(TARGET, ...) (TARGET |= MASK(__VA_ARGS__))
- #define SET_BIT(TARGET, BIT) (TARGET |= SHIFT(BIT))
- #define CLEAR_BITS(TARGET, ...) (TARGET &= ~MASK(__VA_ARGS__)))
- #define CLEAR_BIT(TARGET, BIT) (TARGET &= ~SHIFT(BIT))
- #define GET_BITS(SOURCE, ...) (SOURCE & MASK(__VA_ARGS__))
- #define GET_BIT(SOURCE, BIT) (SOURCE & SHIFT(BIT))
-
- int main () {
- unsigned char PORTA = 0;
-
- SET_BIT (PORTA, 1);
- printf ("PORTA is now %d\n", PORTA);
- SET_BITS (PORTA, 2, 7);
- printf ("PORTA is now %d\n", PORTA);
- CLEAR_BIT (PORTA, 2);
- printf ("PORTA is now %d\n", PORTA);
- CLEAR_BITS (PORTA, 1, 7);
- SET_BIT (PORTA, 0);
- printf ("PORTA is now %d\n", PORTA);
-
- return 0;
- }
-